package cn.gyn.gynrpc.core.api;

import cn.gyn.gynrpc.core.meta.InstanceMeta;
import cn.gyn.gynrpc.core.meta.ServiceMeta;
import cn.gyn.gynrpc.core.registry.ChangedListener;

import java.util.List;

/**
 * ZK实现注册中心
 */
public interface RegistryCenter {
    //启动zk过程 provider\consumer都有
    void start();

    //停止zk过程 provider\consumer都有
    void stop();


    //region provider侧：

    /**
     * 注册服务
     * @param service 服务
     * @param instance 当前节点
     */
    void register(ServiceMeta service, InstanceMeta instance);

    /**
     * 取消注册服务
     * @param service 服务
     * @param instance 当前节点
     */
    void unRegister(ServiceMeta service, InstanceMeta instance);
    //endRegion


    //region consumer侧：

    /**
     * 获取所有服务列表
     * @param service
     * @return
     */
    List<InstanceMeta> fetchAll(ServiceMeta service);

    /**
     * 订阅当前服务变化
     */
    void subscribe(ServiceMeta service, ChangedListener listenr);

    /**
     * 心跳（zk会自动做，所以可以忽略）
     */
    //void heartbeat();
    //endRegion


    //实现一个静态的注册中心
    class staticRegistryCenter implements RegistryCenter {
        List<InstanceMeta> providers;

        //构造函数必传providers
        public staticRegistryCenter(List<InstanceMeta> providers) {
            this.providers = providers;
        }

        @Override
        public void start() {

        }

        @Override
        public void stop() {

        }

        @Override
        public void register(ServiceMeta service, InstanceMeta instance) {

        }

        @Override
        public void unRegister(ServiceMeta service, InstanceMeta instance) {

        }

        //静态的只默认实现这个功能
        @Override
        public List<InstanceMeta> fetchAll(ServiceMeta service) {
            return providers;
        }

        @Override
        public void subscribe(ServiceMeta service, ChangedListener listenr) {

        }
    }
}
